home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
util
/
boot
/
snap_v2_0.lha
/
Snap
/
OpenClose.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-04
|
14KB
|
640 lines
/* Auto: make "CCEXTRA=-wq -qf"
*/
#include "Snap.h"
IMPORT BOOL Kick36;
IMPORT LONGBITS startsignal, insertsignal, cancelsignal;
IMPORT LONGBITS donesignal, movesignal, clicksignal;
IMPORT LONGBITS timersignal, initsignal, cwsignal, ticksignal;
IMPORT ULONG startsignum, insertsignum, cancelsignum;
IMPORT ULONG donesignum, movesignum, clicksignum;
IMPORT ULONG initsignum, cwsignum, ticksignum;
/* program */
IMPORT struct SnapRsrc *SnapRsrc;
IMPORT struct Task *MyTask;
/* Snap state machine */
IMPORT WORD action;
IMPORT WORD state;
/* clipboard */
IMPORT struct IOClipReq *ClipReq;
IMPORT struct MsgPort *ClipPort;
/* timer device */
IMPORT struct MsgPort *TimerPort;
IMPORT struct timerequest MyTR;
/* input device */
IMPORT struct MsgPort *inputDevPort;
IMPORT struct Interrupt handlerStuff;
IMPORT struct IOStdReq *inputRequestBlock;
IMPORT UBYTE *CharData;
/* console */
IMPORT struct MsgPort *ConPort;
IMPORT struct IOStdReq *ConIOR;
IMPORT struct KeyMap keymap;
/* windows */
#ifdef SNAPGFX
IMPORT struct MsgPort *Sharedport;
IMPORT SHORT Sharedrefs;
#endif /* SNAPGFX */
/* libraries */
IMPORT struct IntuitionBase *IntuitionBase;
IMPORT struct GfxBase *GfxBase;
IMPORT struct Library *LayersBase;
IMPORT struct Library *DiskfontBase;
IMPORT struct Library *IconBase;
#ifdef SNAPGFX
#ifdef REQLIB
IMPORT struct ReqBase *ReqBase;
#endif /* REQLIB */
#ifdef ASLLIB
IMPORT struct Library *AslBase;
#endif /* ASLLIB */
#endif /* SNAPGFX */
/* graphics */
IMPORT struct RastPort TempRp;
IMPORT struct BitMap TempBM;
IMPORT UBYTE *TempRaster;
#ifdef SNAPGFX
#ifdef REQLIB
IMPORT struct ReqFileRequester *NameFR;
#endif /* REQLIB */
#ifdef ASLLIB
#define SetTag( t,i,v) { ( t).ti_Tag = i; ( t).ti_Data = ( ULONG)( v); }
IMPORT struct FileRequester *AslNameFR;
#endif /* ASLLIB */
IMPORT struct Image ActiveDiskImage;
IMPORT struct Image InactiveDiskImage;
IMPORT struct Image SelDiskImage;
IMPORT struct Image ActiveClipImage;
IMPORT struct Image InactiveClipImage;
IMPORT struct Image SelClipImage;
IMPORT struct Gadget DiskGad;
IMPORT struct Gadget ClipGad;
UWORD DiskImData36[ 144] =
{
/* Inactive */
0x0000, 0x0000,
0x0000, 0x4000,
0x07f8, 0x4000,
0x0408, 0x4000,
0x05E8, 0x4000,
0x0408, 0x4000,
0x07F8, 0x4000,
0x0618, 0x4000,
0x0698, 0x4000,
0x0698, 0x4000,
0x0000, 0x4000,
0x7FFF, 0xC000,
0xFFFF, 0xC000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
/* Active */
0x0000, 0x0000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7C0F, 0xC000,
0x7DEF, 0xC000,
0x7C0F, 0xC000,
0x7FFF, 0xC000,
0x7E1F, 0xC000,
0x7E9F, 0xC000,
0x7E9F, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0xFFFF, 0xC000,
0xFFFF, 0x8000,
0xF807, 0x8000,
0xFBF7, 0x8000,
0xFA17, 0x8000,
0xFBF7, 0x8000,
0xF807, 0x8000,
0xF9E7, 0x8000,
0xF967, 0x8000,
0xF967, 0x8000,
0xFFFF, 0x8000,
0x8000, 0x0000,
/* Selected */
0xFFFF, 0xC000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFC0F, 0x8000,
0xFDEF, 0x8000,
0xFC0F, 0x8000,
0xFFFF, 0x8000,
0xFE1F, 0x8000,
0xFE9F, 0x8000,
0xFE9F, 0x8000,
0xFFFF, 0x8000,
0x8000, 0x0000,
0x0000, 0x0000,
0x7FFF, 0xC000,
0x7807, 0xC000,
0x7BF7, 0xC000,
0x7A17, 0xC000,
0x7BF7, 0xC000,
0x7807, 0xC000,
0x79E7, 0xC000,
0x7967, 0xC000,
0x7967, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000
};
UWORD DiskImData[ 13] =
{
/* BitPlane 0 */
0xFFFF,
0xFFFF,
0xFFFF,
0xF00F,
0xF7EF,
0xF42F,
0xF7EF,
0xF00F,
0xF3CF,
0xF2CF,
0xF2CF,
0xFFFF,
0xFFFF
};
UWORD ClipImData36[ 156] =
{
/* Inactive */
0x0000, 0x0000,
0x0000, 0x4000,
0x0C00, 0x4000,
0x120E, 0x4000,
0x1A38, 0x4000,
0x0EE0, 0x4000,
0x0380, 0x4000,
0x0EE0, 0x4000,
0x1A38, 0x4000,
0x120E, 0x4000,
0x0C00, 0x4000,
0x0000, 0x4000,
0x7FFF, 0xC000,
0xFFFF, 0xC000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
0x8000, 0x0000,
/* Active */
0x0000, 0x0000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000,
0xFFFF, 0xC000,
0xFFFF, 0x8000,
0xF3FF, 0x8000,
0xEDF1, 0x8000,
0xE5C7, 0x8000,
0xF11F, 0x8000,
0xFC7F, 0x8000,
0xF11F, 0x8000,
0xE5C7, 0x8000,
0xEDF1, 0x8000,
0xF3FF, 0x8000,
0xFFFF, 0x8000,
0x8000, 0x0000,
/* Selected */
0xFFFF, 0xC000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0xFFFF, 0x8000,
0x8000, 0x0000,
0x0000, 0x0000,
0x7FFF, 0xC000,
0x73FF, 0xC000,
0x6DF1, 0xC000,
0x65C7, 0xC000,
0x711F, 0xC000,
0x7C7F, 0xC000,
0x711F, 0xC000,
0x65C7, 0xC000,
0x6DF1, 0xC000,
0x73FF, 0xC000,
0x7FFF, 0xC000,
0x7FFF, 0xC000
};
UWORD ClipImData[ 14] =
{
/* BitPlane 0 */
0xFFFF,
0xFFFF,
0xE7FF,
0xDBE3,
0xCB8F,
0xE23F,
0xF8FF,
0xE23F,
0xCB8F,
0xDBE3,
0xE7FF,
0xFFFF,
0xFFFF,
0xFFFF
};
#endif /* SNAPGFX */
VOID CloseStuff( )
{
SafeRestore( );
if ( SnapRsrc)
{
KILLLIST( &SnapRsrc->CachedWindows, struct CacheWindow);
if ( SnapRsrc->AlternateFont)
{
CloseFont( SnapRsrc->AlternateFont);
}
}
#ifdef SNAPGFX
if ( InactiveDiskImage.ImageData)
{
FreeMem( InactiveDiskImage.ImageData,
Kick36 ? sizeof ( DiskImData36) : sizeof ( DiskImData));
}
if ( InactiveClipImage.ImageData)
{
FreeMem( InactiveClipImage.ImageData,
Kick36 ? sizeof ( ClipImData36) : sizeof ( ClipImData));
}
#endif /* SNAPGFX */
if ( TempRaster)
FreeRaster( TempRaster, 16L, CHEIGHT);
if ( CharData)
FreeRaster( CharData, 16L, 256L * CHEIGHT);
if ( inputRequestBlock)
{
if ( inputRequestBlock->io_Device)
{
inputRequestBlock->io_Command = IND_REMHANDLER; /* Remove handler */
inputRequestBlock->io_Data = ( APTR) & handlerStuff;
DoIO( ( struct IORequest *)inputRequestBlock);
CloseDevice( ( struct IORequest *)inputRequestBlock);
}
DeleteExtIO( ( struct IORequest *)inputRequestBlock);
}
if ( inputDevPort)
DeletePort( inputDevPort);
if ( TimerPort)
{
DeletePort( TimerPort);
CloseDevice( ( struct IORequest *)&MyTR);
}
if ( ConIOR)
{
CloseDevice( ( struct IORequest *)ConIOR);
DeleteExtIO( ( struct IORequest *)ConIOR);
}
if ( ConPort)
DeletePort( ConPort);
if ( ClipReq)
{
if ( ClipReq->io_Device)
{
CloseDevice( ( struct IORequest *)ClipReq);
}
DeleteExtIO( ( struct IORequest *)ClipReq);
}
if ( ClipPort)
DeletePort( ClipPort);
if ( startsignum != -1)
FreeSignal( startsignum);
if ( donesignum != -1)
FreeSignal( donesignum);
if ( cancelsignum != -1)
FreeSignal( cancelsignum);
if ( movesignum != -1)
FreeSignal( movesignum);
if ( insertsignum != -1)
FreeSignal( insertsignum);
if ( clicksignum != -1)
FreeSignal( clicksignum);
if ( initsignum != -1)
FreeSignal( initsignum);
if ( cwsignum != -1)
FreeSignal( cwsignum);
if ( ticksignum != -1)
FreeSignal( ticksignum);
if ( SnapRsrc)
{
RemResource( ( struct MiscResource *)SnapRsrc);
Kill( SnapRsrc);
}
#ifdef SNAPGFX
#ifdef ASLLIB
if ( AslBase && AslNameFR)
FreeFileRequest( AslNameFR);
#endif /* ASLLIB */
#ifdef REQLIB
if ( ReqBase && NameFR)
Delete( NameFR);
#endif /* REQLIB */
#endif /* SNAPGFX */
}
VOID CloseLibs( )
{
#ifdef SNAPGFX
#ifdef ASLLIB
if ( AslBase)
CloseLibrary( AslBase);
#endif /* ASLLIB */
#ifdef REQLIB
if ( ReqBase)
CloseLibrary( ( struct Library *)ReqBase);
#endif /* REQLIB */
#endif /* SNAPGFX */
if ( IconBase)
CloseLibrary( IconBase);
if ( DiskfontBase)
CloseLibrary( ( struct Library *)DiskfontBase);
if ( IntuitionBase)
CloseLibrary( ( struct Library *)IntuitionBase);
if ( GfxBase)
CloseLibrary( ( struct Library *)GfxBase);
if ( LayersBase)
CloseLibrary( ( struct Library *)LayersBase);
}
WORD OpenLibs( )
{
/* libraries */
if ( !( GfxBase = ( struct GfxBase *)OpenLibrary( "graphics.library", 0L)))
return 0;
if ( !( IntuitionBase = ( struct IntuitionBase *)OpenLibrary( "intuition.library", 0L)))
return 0;
if ( !( LayersBase = OpenLibrary( "layers.library", 0L)))
return 0;
DiskfontBase = OpenLibrary( "diskfont.library", 0L);
IconBase = OpenLibrary( ICONNAME, 0L);
#ifdef SNAPGFX
#ifdef REQLIB
ReqBase = ( struct ReqBase *)OpenLibrary( "req.library", 0L);
#endif /* REQLIB */
#ifdef ASLLIB
AslBase = OpenLibrary( AslName, 0L);
#endif /* ASLLIB */
#endif
return 1;
}
WORD OpenStuff( )
{
action = noaction;
state = waiting;
inputRequestBlock = NULL;
#ifdef SNAPGFX
Sharedrefs = 0;
Sharedport = NULL;
#endif /* SNAPGFX */
/* Set up everything we need. */
#ifdef SNAPGFX
#ifdef REQLIB
if ( ReqBase)
{
NameFR = Create( ReqFileRequester);
}
#endif /* REQLIB */
#ifdef ASLLIB
if ( AslBase)
{
struct TagItem FRTags[ 4];
SetTag( FRTags[ 0], ASL_Hail, "Save Picture As...");
SetTag( FRTags[ 1], ASL_Dir, "t:");
SetTag( FRTags[ 2], ASL_File, "Snap.pic");
SetTag( FRTags[ 3], TAG_END, NULL);
AslNameFR = AllocAslRequest( ASL_FileRequest, FRTags);
}
#endif /* ASLLIB */
#endif /* SNAPGFX */
/* signals */
if ( ( startsignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( insertsignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( cancelsignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( donesignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( movesignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( clicksignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( initsignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( cwsignum = AllocSignal( -1L)) == -1L)
return 0;
if ( ( ticksignum = AllocSignal( -1L)) == -1L)
return 0;
MyTask = FindTask( NULL); /* Find myself to Signal me. */
startsignal = 1L << startsignum; /* No good to use bit numbers */
insertsignal = 1L << insertsignum;
cancelsignal = 1L << cancelsignum;
donesignal = 1L << donesignum;
movesignal = 1L << movesignum;
clicksignal = 1L << clicksignum;
initsignal = 1L << initsignum;
cwsignal = 1L << cwsignum;
ticksignal = 1L << ticksignum;
/* clipboard device */
if ( !( ClipPort = CreatePort( 0L, 0L)))
return 0;
if ( !( ClipReq = ( struct IOClipReq *)CreateExtIO( ClipPort, ( LONG) sizeof ( *ClipReq))))
return 0;
if ( OpenDevice( "clipboard.device", 0L, ( struct IORequest *)ClipReq, 0L))
return 0;
ClipReq->io_ClipID = 0L;
/* console device */
if ( !( ConPort = CreatePort( 0L, 0L)))
return 0;
if ( !( ConIOR = ( struct IOStdReq *)CreateExtIO( ConPort, ( LONG) sizeof ( struct IOStdReq))))
return 0;
if ( OpenDevice( "console.device", -1L, ( struct IORequest *)ConIOR, 0L))
return 0;
/* timer device */
if ( !( TimerPort = CreatePort( NULL, 0L)))
return 0;
timersignal = 1L << TimerPort->mp_SigBit;
if ( OpenDevice( TIMERNAME, UNIT_VBLANK, ( struct IORequest *)&MyTR, 0))
return 0;
MyTR.tr_node.io_Message.mn_ReplyPort = TimerPort;
MyTR.tr_node.io_Error = 0;
/* input device */
if ( !( inputDevPort = CreatePort( 0L, 0L)))
return 0;
if ( !( inputRequestBlock = ( struct IOStdReq *)CreateExtIO( inputDevPort, ( LONG) sizeof ( struct IOStdReq))))
return 0;
if ( OpenDevice( "input.device", 0L, ( struct IORequest *)inputRequestBlock, 0L))
return 0;
/* input handler */
handlerStuff.is_Data = ( APTR) 0x534E4150; /* Set up for installation of */
handlerStuff.is_Code = (void (* )())myhandler; /* myhandler. */
handlerStuff.is_Node.ln_Pri = SnapRsrc->Priority;
/* Ahead of intuition, please */
handlerStuff.is_Node.ln_Name = "Snap Input Handler";
inputRequestBlock->io_Command = IND_ADDHANDLER;
inputRequestBlock->io_Data = ( APTR) & handlerStuff;
DoIO( ( struct IORequest *)inputRequestBlock); /* Add me. */
/* Aligned font bitmap to use when matching */
if ( !( CharData = AllocRaster( 16L, 256L * CHEIGHT)))
{
return 0;
}
/* temporary raster */
if ( !( TempRaster = AllocRaster( 16L, CHEIGHT)))
return 0;
InitRastPort( &TempRp); /* Init RastPort used for */
InitBitMap( &TempBM, 1L, 16L, CHEIGHT); /* Locating position of */
TempBM.Planes[ 0] = TempRaster; /* first character. */
TempRp.BitMap = &TempBM;
#ifdef SNAPGFX
{
WORD i;
UWORD *DiskImageData;
UWORD *ClipImageData;
LONG DiskImageSize;
LONG ClipImageSize;
if ( Kick36)
{
ActiveDiskImage = SelDiskImage = InactiveDiskImage;
ActiveClipImage = SelClipImage = InactiveClipImage;
DiskImageData = DiskImData36;
ClipImageData = ClipImData36;
DiskImageSize = sizeof ( DiskImData36);
ClipImageSize = sizeof ( ClipImData36);
DiskGad.Flags |= GADGHIMAGE;
ClipGad.Flags |= GADGHIMAGE;
}
else
{
InactiveDiskImage = SelDiskImage = ActiveDiskImage;
InactiveClipImage = SelClipImage = ActiveClipImage;
DiskImageData = DiskImData;
ClipImageData = ClipImData;
DiskImageSize = sizeof ( DiskImData);
ClipImageSize = sizeof ( ClipImData);
DiskGad.Flags |= GADGHCOMP;
ClipGad.Flags |= GADGHCOMP;
}
if ( !( InactiveDiskImage.ImageData = AllocMem( DiskImageSize, MEMF_CHIP)))
{
return 0;
}
ActiveDiskImage.ImageData = &InactiveDiskImage.ImageData[ Kick36 ? 48 : 0];
SelDiskImage.ImageData = &InactiveDiskImage.ImageData[ Kick36 ? 96 : 0];
for ( i = 0; i < ( DiskImageSize / sizeof ( UWORD)); i++)
{
InactiveDiskImage.ImageData[ i] = DiskImageData[ i];
}
if ( !( InactiveClipImage.ImageData = AllocMem( ClipImageSize, MEMF_CHIP)))
{
return 0;
}
ActiveClipImage.ImageData = &InactiveClipImage.ImageData[ Kick36 ? 52 : 0];
SelClipImage.ImageData = &InactiveClipImage.ImageData[ Kick36 ? 104 : 0];
for ( i = 0; i < ( ClipImageSize / sizeof ( UWORD)); i++)
{
InactiveClipImage.ImageData[ i] = ClipImageData[ i];
}
}
#endif /* SNAPGFX */
return 1;
}